package cn.sh.tools.util;

import com.madgag.gif.fmsware.AnimatedGifEncoder;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Optional;

/**
 * @Description image
 * @Classname ImageUtils
 * @Date 2023/5/19
 * @Author sh
 **/
public class ImageUtils {

    public static final String GIF_SUFFIX = ".gif";

    /**
     * 多图转 gif
     *
     * @param imageList 待合成的多张图片
     * @param imgPath   待合成的多张图片的路径
     * @param gifName   最终生成的gif动图的文件名
     * @param delay     图片之间的间隔（毫秒）
     */
    public static void imagesToGif(java.util.List<BufferedImage> imageList,
                                   String imgPath, String gifName, Integer delay) throws IOException {
        if (!gifName.endsWith(GIF_SUFFIX)) {
            gifName += GIF_SUFFIX;
        }
        // 最终生成的gif动图文件路径（路径 + 文件名）
        String gifPath = imgPath + gifName;
        delay = Optional.ofNullable(delay).orElse(1000);
        // 拆分一帧一帧的压缩之后合成
        AnimatedGifEncoder encoder = new AnimatedGifEncoder();
        encoder.start(gifPath);
        // 设置GIF帧集的播放次数。默认值为-1；0表示无限期播放。必须在添加第一个图像之前调用。
        encoder.setRepeat(0);
        for (BufferedImage bufferedImage : imageList) {
            // 每张图片之间的时间间隔，单位：毫秒。
            encoder.setDelay(delay);
            // 获取图片的 高、宽
            int height = bufferedImage.getHeight();
            int width = bufferedImage.getWidth();

            BufferedImage zoomImage = new BufferedImage(width, height, 3);
            Image image = bufferedImage.getScaledInstance(width, height, Image.SCALE_SMOOTH);

            // 图层（相当于画板）
            Graphics gc = zoomImage.getGraphics();
            gc.setColor(Color.WHITE);
            // 在图层上画画
            gc.drawImage(image, 0, 0, null);

            encoder.addFrame(zoomImage);
        }
        encoder.finish();

        File outFile = new File(gifPath);
        BufferedImage image = ImageIO.read(outFile);
        ImageIO.write(image, outFile.getName(), outFile);
    }

}
